

超音波感測器是一種常用於測量距離和檢測物體是否存在的設備。利用超音波的傳播速度來測量距離。以下是其感測原理:
超音波感測器的特點:
超音波感測器是過去 Arduino 專案中很常用到的一個實驗模組。不過要注意的是,在 Arduino 的實驗,我們常會使用「HY-SRF05」這個型號,這個型號使用的工作電壓是 5V。而在 ESP32 或是樹梅派開發板上,我們則會選擇使用「HC-SR04」,這個版本,其特點有:

# 本範例使用 HC-SR04 模組
# 請將 GND 接地接到玩學機的 GND 腳位
# 請將 VCC 電源接到玩學機的 VCC 腳位
from machine import Pin, Timer
import utime
TRIGGER_PIN = 18 
ECHO_PIN = 19  
# 初始化腳位
trigger = Pin(TRIGGER_PIN, Pin.OUT) 
echo = Pin(ECHO_PIN, Pin.IN) 
def ping():
    trigger.value(0)
    utime.sleep_us(2) # 低電位等 2 微秒
    trigger.value(1)
    utime.sleep_us(5) # 高電位等 5 微秒
    trigger.value(0)
    while echo.value() == 0:
        signaloff = utime.ticks_us()
    while echo.value() == 1:
        signalon = utime.ticks_us()
    timepassed = signalon - signaloff
    distance = (timepassed * 0.0343) / 2
    return distance
while True:
    print("The distance is : ", round(ping(), 0), " cm.")
    utime.sleep(.25)

玩法:

from machine import Pin, Timer
import utime
machine.Pin(5, machine.Pin.OUT).value(1)		# VCC
trig = Pin(21, machine.Pin.OUT) 
echo = Pin(19, machine.Pin.IN) 
machine.Pin(18, machine.Pin.OUT).value(0) 		# GND
 
machine.Pin(17,2).value(1) 						# 設定蜂鳴器
snd = machine.PWM(machine.Pin(25 ,2)) 
snd.duty(0) 
 
wb.cls() 
wb.colors(0xffff,0) 
wb.str("Ultrasonic Piano", 0, 0, 2, 2) 
wb.str("Press any key to play music!", 10, 20, 2, 1) 
wb.str("CM", 100, 80, 2, 5) 
wb.colors(0xc0ff,0) 
while True: 
        trig.value(1) 
        trig.value(0) 
        timeout = 0 
        while not echo.value():   
                timeout += 1 
                if timeout > 1000: break       
        start=time.ticks_us() 
        timeout=0 
        while echo.value():   
                timeout += 1       
                if timeout > 1000000: break   
        duration=time.ticks_diff(time.ticks_us(), start) 
        distance = int(duration/58) 
        if duration < 20000: 
            wb.str("%03d"%(distance), 40,80,2,5) 
                 
        time.sleep(0.1) 
        # print(wb.getkey())
        if wb.getkey() != 0: 
            snd.duty(50) 
            if distance < 10 : snd.freq(261)   # do 
            elif distance < 18 : snd.freq(293) # re 
            elif distance < 26 : snd.freq(330) # mi 
            elif distance < 34 : snd.freq(349) # fa                           
            elif distance < 40 : snd.freq(392) # so   
        else: snd.duty(0)
超音波感測器是不是很好玩呢?休息一下,明天我們繼續來學「用四位七段顯示器來做小時鐘」。